/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.output.p44;

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.StringTokenizer;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IPersonnePhysique;
import fr.generali.accueilclient.client.om.impl.PersonnePhysique;
import fr.generali.refservcommuns.clients.prima.DatedMonetaryQuantityRangeValue;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoDetailActiviteProfessionnelle;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoPersonnePhysique;

/**
 * Transforme un {@link DtoPersonnePhysique} en {@link IPersonnePhysique}
 * 
 * @author selrhazala
 */
@Component("dtoPersonnePhysique2PersonnePhysiqueP44Converter")
public class DtoPersonnePhysique2PersonnePhysiqueP44Converter implements
                Converter<DtoPersonnePhysique, IPersonnePhysique> {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory
                    .getLogger(DtoPersonnePhysique2PersonnePhysiqueP44Converter.class);

    /**
     * {@inheritDoc}
     */
    public IPersonnePhysique convert(DtoPersonnePhysique input) {
        LOGGER.info("assemble");
        IPersonnePhysique personne = new PersonnePhysique();

        personne.setCivilite(input.getCivilite());
        if (input.getDateNaissance() != null) {
            personne.setDateNaissance(input.getDateNaissance().toGregorianCalendar().getTime());
        }
        if (input.getDateDeces() != null) {
            personne.setDateDeces(input.getDateDeces().toGregorianCalendar().getTime());
        }
        if (input.getDetailNaissance() != null) {
            personne.setLieuNaissance(StringUtils.trimToNull(input.getDetailNaissance().getLieuNaissance()));
            personne.setCpNaissance(StringUtils.trimToNull(input.getDetailNaissance().getCodePostalNaissance()));
            personne.setPaysNaissance(StringUtils.trimToNull(input.getDetailNaissance().getPaysDeNaissance()));
        }
        personne.setNom(input.getNom());
        personne.setNomJeuneFille(input.getNomJeuneFille());
        personne.setPrenom(input.getPrenom());
        personne.setSexe(input.getSexe());
        personne.setTitre(input.getTitre());
        personne.setNationalite(input.getNationalite());
        if (input.isVip() != null) {
            personne.setClientVIP(input.isVip());
        }
        if (input.isIndicateurCollaborateur() != null) {
            personne.setCollaborateurGenerali(input.isIndicateurCollaborateur());
        }
        if (input.isVivante() != null) {
            personne.setVivante(input.isVivante());
        }
        personne.setOrigineClient(input.getRaisonConnaissanceTiers());

        personne.setTutelle(input.getGestionTutelleCuratelle());
        personne.setRegimeObligatoire(input.getCodeTypeAffiliation());

        if (input.getRelationClient() != null) {
            personne.setTitreCourrier(input.getRelationClient().getTitreCourrier());
        }

        if (input.getCategorieSocioProfessionnelle() != null
                        && StringUtils.isNotEmpty(input.getCategorieSocioProfessionnelle().getCodePCS())) {
            StringTokenizer listeCSP =
                            new StringTokenizer(input.getCategorieSocioProfessionnelle().getCodePCS(), ";", false);
            int niveauCSP = 1;
            while (listeCSP.hasMoreTokens()) {
                switch (niveauCSP) {
                    case 1:
                        personne.setStatutProfessionnel1(listeCSP.nextToken());
                        break;
                    case 2:
                        personne.setStatutProfessionnel2(listeCSP.nextToken());
                        break;
                    case 3:
                        personne.setStatutProfessionnel3(listeCSP.nextToken());
                        break;
                    case 4:
                        personne.setStatutProfessionnel4(listeCSP.nextToken());
                        break;
                    default:
                        break;
                }

                niveauCSP++;
            }
            personne.setStatutProfessionnelNiveau(niveauCSP - 1);
        }

        personne.setIdClientFue(input.getDenominationFUE());
        personne.setCompteEspaceClient(input.getCompteEspaceClient());

        if (input.getDateDebutClient() != null) {
            personne.setDateDebut(input.getDateDebutClient().toGregorianCalendar().getTime());
            personne.setDatePassageClient(input.getDateDebutClient().toGregorianCalendar().getTime());
        }

        if (input.getDateFinClient() != null) {
            personne.setDateFinClient(input.getDateFinClient().toGregorianCalendar().getTime());
        }

        if (input.getDetailSituationFamiliale() != null) {
            if (input.getDetailSituationFamiliale().getNombreEnfants() != null) {
                personne.setNbEnfants(input.getDetailSituationFamiliale().getNombreEnfants().toString());
            }
            if (input.getDetailSituationFamiliale().getEtatUnion() != null) {
                personne.setSituationFamiliale(input.getDetailSituationFamiliale().getEtatUnion().toString());
            }
            if (input.getDetailSituationFamiliale().getStatutMatrimonial() != null) {
                personne.setRegimeMatrimonial(input.getDetailSituationFamiliale().getStatutMatrimonial().toString());
            }
        }

        if (CollectionUtils.isNotEmpty(input.getDetailActiviteProfessionnelle())) {
            DtoDetailActiviteProfessionnelle dtoDetailActiviteProfessionnelle =
                            input.getDetailActiviteProfessionnelle().get(0);
            DatedMonetaryQuantityRangeValue dmq = dtoDetailActiviteProfessionnelle.getRevenuBorne();

            if (dmq != null && dmq.getCodeIndicateurSaisie() != null) {
                personne.setRevenuAnnuel(dmq.getCodeIndicateurSaisie());

            }

            if (dtoDetailActiviteProfessionnelle.getBlocNote() != null) {
                personne.setPrecisionProfession(dtoDetailActiviteProfessionnelle.getBlocNote().getPrecisionProfession());
            }

            if (dtoDetailActiviteProfessionnelle.getPeriodeFiscale() != null) {
                SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd", Locale.FRANCE);
                String strDate =
                                formatter.format(dtoDetailActiviteProfessionnelle.getPeriodeFiscale()
                                                .toGregorianCalendar().getTime());
                if (strDate != null && strDate.trim().length() > 4) {
                    String strAnnee = strDate.substring(0, 4);
                    personne.setAnneeRevenu(strAnnee);
                }
            }
        }

        return personne;
    }

}
